#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*
    创建二叉树节点 
    存储数据 
    左子树 
    右子树 
*/
typedef struct BinaryNode{
    int data;
    struct BinaryNode* left;
    struct BinaryNode* right;
}BTNode;

/*
    创建节点
    首先新节点申请内存 为空返回，记得不要写 0 
    然后 数据赋值为 n 
    左右置为空即可
    最后返回新节点
*/
BTNode* createNode(int n);


/*
    插入节点  参数 根节点的地址，新节点
    如果根节点地址为空 那么新节点作为根节点 返回即可
    然后分为两种情况讨论 
    1. 如果新节点的数据小于根节点的数据
            左空 就让新节点成为根节点的左子树
        否则 递归调用根节点的右子树 
    2. 新节点的数据大于根节点的数据 
            右空 新节点成为根节点的右子树
        否则 递归调用左子树 
*/
void insertBTNode(BTNode** root,BTNode* newNode);


//    前序遍历   
void preOrder(BTNode* root);

// 中序遍历
void inOrder(BTNode* root);

// 后序遍历
void postNode(BTNode* root);

/*
    获取节点数目
    如果根节点不空 
    返回 计数 + 递归左 + 递归右
*/
int BTSize(BTNode* root);


/*
    如果根为空 返回 0 
    左高度 就递归左子树 
    右高度 就递归右子树 
    返回 判断 左右谁大 对应的左或者右+1即可(三目运算符比较方便)
*/
int getHeight(BTNode* root);

/*
    如果根是空 直接返回 
    层次为 1 直接打印根数据 
        大于 1 递归调用左 和 右 同时层次-1
*/
void printLevel(BTNode* root,int level);

/*
    高度 从 getHeight获取到
    循环打印层次即可
*/
void levelOrder(BTNode* root);


int main(){}
